using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

/// <summary>
/// Summary description for PerfilesBD
/// </summary>
public class PerfilesBD
{	
	//Constructor de Perfil
	public PerfilesBD()
	{
		//
		// TODO: Add constructor logic here
		//
	}
	//Consulta de Perfiles para cargar el combo box, obtengo (nombre y descripcion)
    public DataTable ConsultarPerfiles()
    {
        
        DataTable resultados = new DataTable();
        SqlDataAdapter adpPerfiles = new SqlDataAdapter();
		
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar!
            SqlCommand cmd = 
                new SqlCommand("Select nombre, descripcion  from Perfiles");
				
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpPerfiles.SelectCommand = cmd;
            adpPerfiles.Fill(resultados);
        }

        return resultados;
    }
	
	//funcion de consulta de los datos especificos de un perfil, devuelve la entidad perfil
    public PerfilesEnt ConsultarPerfil(string nombre)
    {
        PerfilesEnt resultado = null;
       
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar
            SqlCommand cmd = new SqlCommand("Select nombre, descripcion from Perfiles where nombre = @nombre");
            cmd.Connection = cnn;

            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@nombre", nombre));//especificacion del parametro
																	//Para consultar

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerPerfil(dr); //obtengo la entidad de perfil
            }
        }
        return resultado;
    }

	//leer tupla correspondiente al perfil
    private PerfilesEnt ObtenerPerfil(SqlDataReader dr)
    {
        PerfilesEnt resultado = null;
        List<PermisosEnt> permisos = null;
        if (dr.HasRows)
        {
            dr.Read();//leo la tupla
			//obtengo los valores

            int colNombre = dr.GetOrdinal("Nombre");
            int colDescripcion = dr.GetOrdinal("Descripcion");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);

			//casteo los valores al tipo correspondiente
            string nombre = (string)valores[colNombre];
            string descripcion = (string)valores[colDescripcion];
            //obtengo los permisos asociados al perfil
			permisos = this.ObtenerPermisos(nombre);
			//Creo la entidad de perfil con los parametros correspondientes
            resultado = (!DBNull.Value.Equals(resultado))? new PerfilesEnt(nombre,descripcion,permisos):null;
        }
        return resultado;
    }
	
	//obtengo y devuelvo la lista de los permisos de un perfil
    private List<PermisosEnt> ObtenerPermisos(string nombre)
    {
        List<PermisosEnt> resultados = new List<PermisosEnt>();

		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//declaro el comando de consulta a ejecutar para obtener los permisos de un perfil
            SqlCommand cmd = new SqlCommand("SELECT p.PermisoID, pm.modulo, pm.acceso FROM ( select * from Perfiles_Permisos pp where pp.NombrePerfil = @nombre) p RIGHT OUTER JOIN Permisos pm on p.PermisoID = pm.ID;");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@nombre", nombre));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                
				int colPermisoID = dr.GetOrdinal("PermisoID");
                int colModulo = dr.GetOrdinal("Modulo");
                int colAcceso = dr.GetOrdinal("Acceso");
                object[] valores = new object[dr.FieldCount];
                while (dr.Read())//ciclo de lectura de todos los permisos del perfil
                {
                    dr.GetValues(valores);
					//obtengo valores informacion del permiso
                    int idPermiso = (!DBNull.Value.Equals(valores[colPermisoID]))? (int)valores[colPermisoID]:0;
                    string modulo = (string)valores[colModulo];
                    string acceso = (string)valores[colAcceso];
					
					//agrego un nuevo permiso a la lista de permisos del perfil
                    resultados.Add(new PermisosEnt(idPermiso,modulo,acceso));
                }
            }
        }
        return resultados;	//retorno la lista de permisos
    }

	//Metodo de insercion de un perfil en la base de datos
    public bool InsertarPerfil(PerfilesEnt perfil)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Perfiles(nombre, descripcion) values(@nombre,@descripcion)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego todos los parametro correspondientes a datos del perfil
                cmd.Parameters.Add(new SqlParameter("@nombre", perfil.Nombre));
                cmd.Parameters.Add(new SqlParameter("@descripcion", perfil.Descripcion));
                cmd.ExecuteNonQuery();
				
				//inserto todos los permisos del perfil
                foreach(PermisosEnt permisos in perfil.lstPermisos)
                {
                    InsertarPermisosPerfiles(perfil.Nombre,permisos.Acceso,permisos.Modulo);
                }
            }
        }
        catch
        {
            resultado = false; //si no se pudo conectar devuelva falso
        }

        return resultado;
    }

	//metodo de insercion de los permisos de un perfil (asociacion entre perfil y permisos)
    private bool InsertarPermisosPerfiles(string nombre, string acceso, string modulo)
    {
        bool resultado = true;
        SqlCommand cmd;
        try
        {
            //me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaro el comando de insercion a ejecutar				
                cmd = new SqlCommand("Insert Perfiles_Permisos select(select p.id from Permisos p where p.acceso = @acceso and p.modulo = @modulo),@nombrePerfil");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //cmd.CommandText = "InsertarPermisos";
				//agrego todos los parametro correspondientes a los datos ocupados para la consulta
                cmd.Parameters.Add(new SqlParameter("@nombrePerfil", nombre));
                cmd.Parameters.Add(new SqlParameter("@acceso", acceso));
                cmd.Parameters.Add(new SqlParameter("@modulo", modulo));
                cmd.ExecuteNonQuery();
            }
        }
        catch
        {
            resultado = false; //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        }
        return resultado;
    }
	
	//elimina al perfil de la base de datos, recibe el nombre del perfil
    public bool EliminarPerfil(string nombre)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Perfiles where nombre = @nombre");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@nombre", nombre));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }
	
	//Metodo de actualizacion de los datos de un perfil
    public bool ActualizarPerfil(string nombreViejo, PerfilesEnt Perfil)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de modificacion
                SqlCommand cmd = new SqlCommand("Update Perfiles set nombre = @nombre, descripcion = @descripcion where nombre = @nombreViejo");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego los parametros a la consulta
                cmd.Parameters.Add(new SqlParameter("@nombre", Perfil.Nombre));
                cmd.Parameters.Add(new SqlParameter("@nombreViejo", nombreViejo));
                cmd.Parameters.Add(new SqlParameter("@descripcion", Perfil.Descripcion));
                cmd.ExecuteNonQuery();
				
				//elimino todos los permisos exixtentes del perfil
                cmd = new SqlCommand("delete from Perfiles_Permisos where nombrePerfil = @nombre");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@nombre", Perfil.Nombre));
                cmd.ExecuteNonQuery();

				//inserto los nuevos permisos del perfil
                foreach (PermisosEnt permisos in Perfil.lstPermisos)
                {
                    resultado = InsertarPermisosPerfiles(Perfil.Nombre, permisos.Acceso, permisos.Modulo);
                }

            }
            

        }
        catch
        {
            resultado = false; //devuelvo falso si no se logro conectar o hubo un error
        }

        return resultado;
    }
}
